from app.libs.redprint import Redprint
from flask.globals import request
from app.validators.forms import ClientForm, UserEmailForm
from app.libs.enums import ClientTypeEnum
from app.models.user import User
from app.libs.error_code import ClientTypeError, Success

api = Redprint('client')

@api.route('/register', methods=['POST'])
def create_client():
    #1/0
    #注册用户, 表达提交方法 POST
    #表单数据形式， 选用json
    #data = request.json
    #form = ClientForm(data=data)
    #form.validate_for_api()
    # 最终的编程思想: 可以接受定义的复杂，但不能接受调用的复杂
    #链式调用，代替上述3行代码，注意validate_for_api一定要return self，才能这样链式调用
    form = ClientForm().validate_for_api()   
    #如何统一处理:
    #1.已知异常，APIException
    #2.完全没有意识到的未知异常, 如1/0、try:...except..
    #解决方法: AOP(面向切面)思想，类似迷宫， 只要堵住出口就行
    
    promise = {ClientTypeEnum.USER_EMAIL: __register_by_email}
    #通过枚举类型和字典键-值调用XXX()函数
    promise[form.reg_type.data]()
    #操作成功时也要像操失败时返回json格式的信息
    return Success()  
    '''
    if form.validate():
        promise = {ClientTypeEnum.USER_EMAIL: __register_by_email}
                        #通过枚举类型和字典键-值调用XXX()函数
        promise[form.reg_type.data]()
    else:
        raise ClientTypeError()
                        #上述采用raise ClientTypeError()的弊端:
        #1.需要多处调用
        #2.没有将form中的errors属性值也应该作为参数传入
                        #一步到位的解决方法:
                        # 重写wtforms
    return 'success'
    '''

def __register_by_email():
    #data = request.json
    #form = UserEmailForm(data=data)
    #form.validate_for_api()
    #链式调用，代替上述3行代码，注意validate_for_api一定要return self，才能这样链式调用
    form = UserEmailForm().validate_for_api()   
    if form.validate():
        User.register_by_email(form.nickname.data, 
                               form.account.data, 
                               form.secret.data)
    
    
    